Synchronizace vlaken

Otázka od: Antonin Rezac

8. 12. 2003 15:27

Zdravim,
potrebuji synchronizovat praci s globalnim polem, se ktrerym pracuji nejen
thready (TCP komunikace), ale i hlavni thread (do neho chodi zpravy, jejichz
obsluha pracuje s uvedenym polem). Kdyz do krit. sekce (ve ktere mam
uzavrenu praci s polem) vleze nejdriv hlavni thread, ostatni thready
zpusobne cekaji. Pokud se vsak hlavni thread snazi dostat do blokovane krit.
sekce, program zatuhne. Nemate nekdo napad, jak to resit ? Delat thread pro
obslouzni kazde zpravy ani ev. zpravu preposilat do nejakeho spec. threadu
se mi moc nelibi.

Tonda


Odpovedá: Slavomir Skopalik

8. 12. 2003 15:27

Podle vseho mas chybu pri praci s tim polem.
Bud zustane kriticka sekce trvale blokovana (exception),
nebo se behem prace posle zprava do hlavniho threadu (metoda synchronize).
Tim padem pak vsichni cekaji a nic se nedeje.
Ja to obvykle resim pomoci metody synchronize, nebo duslednym
programovanim okolo kritickych sekci.

 Slavek

> zpusobne cekaji. Pokud se vsak hlavni thread snazi dostat do blokovane krit.
> sekce, program zatuhne. Nemate nekdo napad, jak to resit ? Delat thread pro
> obslouzni kazde zpravy ani ev. zpravu preposilat do nejakeho spec. threadu
> se mi moc nelibi.


Odpovedá: delphin@post.cz

8. 12. 2003 18:23

> Zdravim,
> potrebuji synchronizovat praci s globalnim polem, se ktrerym pracuji nejen
> thready (TCP komunikace), ale i hlavni thread (do neho chodi zpravy,
jejichz
> obsluha pracuje s uvedenym polem). Kdyz do krit. sekce (ve ktere mam
> uzavrenu praci s polem) vleze nejdriv hlavni thread, ostatni thready
> zpusobne cekaji. Pokud se vsak hlavni thread snazi dostat do blokovane
krit.
> sekce, program zatuhne. Nemate nekdo napad, jak to resit ? Delat thread
pro
> obslouzni kazde zpravy ani ev. zpravu preposilat do nejakeho spec. threadu
> se mi moc nelibi.

Co presne je v te kriticke sekci ? Neni tam nahodou SendMessage ?


Odpovedá: Antonin Rezac

9. 12. 2003 18:46

... no jo, opravdu to bylo jednim nevhodne umistenym volanim Synchronize.

Mam ale jeste jeden problem. Pro komunikaci pouzivam TidTcpServer. Ten vsak
na rozdil od TTcpServer-u nema neco jako TTcpServer.ServerSocketThread, ale
jen event OnExecute {TIdServerThreadEvent = procedure (AThread:
TIdPeerThread)}. A potrebuji synchronizovat metodu, ktera ma parametry.
Pokud jsem si vytvarel thread u TTcpServer-u sam, bylo to v pohode - pridal
jsem do objektu threadu pomocnou metodu a par predavacich parametru. U
TidTcpServeru vsak nevim, jak na to. Vlakno si vytvari sam objekt serveru a
tak tu pomocnou metodu musim delat jako metodu formulare a parametry jako
napr. glob. promenne. A potom musim pouzit krit. sekci a v te volat
Synchronize ...... lze to udelet nejak inteligentneji ?

Tonda


> Podle vseho mas chybu pri praci s tim polem.
> Bud zustane kriticka sekce trvale blokovana (exception),
> nebo se behem prace posle zprava do hlavniho threadu (metoda synchronize).
> Tim padem pak vsichni cekaji a nic se nedeje.
> Ja to obvykle resim pomoci metody synchronize, nebo duslednym
> programovanim okolo kritickych sekci.
>
> Slavek


Odpovedá: Slavomir Skopalik

10. 12. 2003 11:31

SendMessage a pointer na datovou strukturu.
Jako handle pouzij handle nejakeho formu, nebo se podivej jak je delany
TTimer, pokud to potrebujes na DataModulu.

 Slavek

> Mam ale jeste jeden problem. Pro komunikaci pouzivam TidTcpServer. Ten vsak
> na rozdil od TTcpServer-u nema neco jako TTcpServer.ServerSocketThread, ale
> jen event OnExecute {TIdServerThreadEvent = procedure (AThread:
> TIdPeerThread)}. A potrebuji synchronizovat metodu, ktera ma parametry.
> Pokud jsem si vytvarel thread u TTcpServer-u sam, bylo to v pohode - pridal
> jsem do objektu threadu pomocnou metodu a par predavacich parametru. U
> TidTcpServeru vsak nevim, jak na to. Vlakno si vytvari sam objekt serveru a
> tak tu pomocnou metodu musim delat jako metodu formulare a parametry jako
> napr. glob. promenne. A potom musim pouzit krit. sekci a v te volat
> Synchronize ...... lze to udelet nejak inteligentneji ?
>
> Tonda